(計実) 第5回課題【模範解答】
課題の模範解答です.パーツがわかるように整理しました.
◆模範解答:出題どおりに答えた場合
code:python
# Bパーツ:入力受付
gakuseki = input('学籍番号は? ')
kesseki = eval(input('欠席回数は? '))
miteishutsu = eval(input('未提出回数は? '))
jitsugi = eval(input('実技テストの点数は? '))
# Aパーツ:計算部分
kisoten = 40
kisoten = kisoten - kesseki*10 - miteishutsu*6
if kisoten < 0:
kisoten = 0
total = kisoten + jitsugi
if total >= 60:
gohi = '合格'
else:
gohi = '不合格'
# Cパーツ:出力
line01="=============="
print(line01)
print("番号:", gakuseki)
print("合否:", gohi)
print("総点:", total)
print(line01)
# 以下はCパーツの別のやりかたでprint()
# 2.文字列を結合させる場合(空白なく表示)
print("合否:"+gohi) # gohiは文字列だからそのままでOK
print(line01)
# 3.format文を利用するとすっきり見やすくなる
print(f"合否:{gohi}")
print(f"総点:{total:3d}") #':3d' → 3桁整数で揃える print(line01)
なぜパーツの順番がバラバラかというと,「大切にしてほしい順」です.
Aパーツの計算部分は,プログラムの心臓部分です.ここが正しくできなければプログラム全体の意味がありません.
Bパーツは入力部分で,ざっくり言えばinput()するだけです.
ただ,ちゃんとユーザが入力しやすいように導くという,インタフェースへの配慮が必要です.
Cパーツは計算結果を出すだけです.
print文はいろんな書き方(フォーマット)ができます.
ここでは3種類の書き方を提示しました.
それぞれの特徴を把握し,必要に応じて適切に使い分けをしたいですね.
授業ではやっていませんが,format文は記述がシンプルになり,かつ細かい指定が可能なので,使えると非常に便利です.
◎上のプログラム実行例です。
※出力は3つのパターンで出しています.
code:sh
$ pytoh3 mark-sim.py▼
学籍番号は? Y990999▼ ◀◀ 半角英数字入力
欠席回数は? 1▼ ◀◀ 半角数字入力
未提出回数は? 1▼ ◀◀ 半角数字入力
実技テストの点数は? 40▼ ◀◀ 半角数字入力
============== ◀◀ 出力C-1:普通に出力
番号:y990999
合否:合格
総点:64
============== ◀◀ 出力C-2: ぴったり左詰め
番号:y990999
合否:合格
総点:64
============== ◀◀ 出力C-3: 数値を3桁右詰め表示
番号:y990999
合否:合格
総点: 64
==============
$
◆Bパートのオプション回答例
1. 入力が範囲外だと → エラーを表示して終了する
2. 欠席とレポート未提出入力の範囲外:マイナス,9以上,文字列
3. 実技テスト点入力の範囲外:マイナス,61以上,文字列
4. (追加条件):課題にはないが……:学籍番号は7桁であること
※エラーメッセージ関西バージョンです.
code:mark-sim-B-II.py
gaku = input("学籍番号は? ")
if len(gaku) != 7:
print("##7桁ちゃいますよ")
exit()
ketu = eval(input("欠席回数は? "))
# 小数点になる可能性がなければintを使う
except NameError:
print("##え,数値とちゃうよ?")
exit()
if ketu<0 or ketu>8:
print(f"##{mitei}て,そんなアホな.やりなおし")
exit()
try:
mitei = eval(input("未提出回数は? "))
except NameError:
print("##いやいや,なんかおかしいよ?数字ちゃうよ?")
exit()
if mitei<0 or mitei>8:
print(f"##{mitei}て,ウソやん.やりなおし")
exit()
try:
test = eval(input("実技テストの点数は? "))
except NameError:
print("##あかん.ちゃんと数字入れて")
exit()
if test<0 or test>60:
print(f"##{test}はアカンて.やりなおし")
exit()
◆模範じゃない解答(改造版)
課題を元にして,例外処理などを含めて改造しました.
上のB-IIでは一つ間違えれば強制終了でしたが ▶▶ 入力が例外だったらエラーを表示して,正しい条件になるまで何度でも入力を促すようにしました.
code:mark-sim-E.py
###
# mark-sim.py: 成績判定シミュレータ
###
### Part B-II改:
while True:
gaku = input("学籍番号は? ")
if len(gaku) != 7:
print("##7桁ちゃいますよ")
continue
else:
break
while True:
ketu = input("欠席回数は? ")
try:
ketu = int(ketu)
except ValueError:
print("##え,整数とちゃうよ?")
continue
if ketu>8:
print(f"##{ketu}ってそんなアホな,なんぼ何でも8回までやろ")
continue
elif ketu<0:
print(f"##{ketu}ってどういうことやマイナスて!")
continue
else:
break
while True:
try:
mitei = eval(input("未提出回数は? "))
except NameError:
print("##いやいや,なんかおかしいよ?数字ちゃうよ?")
continue
if mitei<0 or mitei>8:
print("##そんなアホな.やりなおし")
continue
else:
break
while True:
try:
test = eval(input("実技テストの点数は? "))
except NameError:
print("##あかん.ちゃんと数字入れて")
continue
if test>60:
print(f"##{test}てどないやねん.60以上て天才か")
continue
elif test<0:
print(f"##{test}てなんやねん.吸い取ってんのか点数を")
continue
else:
break
### Part-A: 算出部分
kiso = 40
gohi = "合格"
soten = kiso - ketu * 10 - mitei * 6
if soten < 0:
soten = 0
total = test + soten
if total < 60:
gohi = "不合格"
### Part-C: 出力部分
line01="=============="
print(line01)
print(f"番号: {gaku}")
print(f"合否: {gohi}")
print(f"総点: {total}")
print(line01)
◎実行例:
code:text
>> %Run mark-sim-E.py
学籍番号は? ywoeiejf▼
学籍番号は? y990999▼
欠席回数は? tewte▼
欠席回数は? 200▼
欠席回数は? -100▼
欠席回数は? 1▼
未提出回数は? 2000▼
未提出回数は? 1▼
実技テストの点数は? 60000▼
実技テストの点数は? -23▼
実技テストの点数は? 55▼
==============
番号: y210999
合否: 合格
総点: 79
==============
>>
お楽しみください.
以上.
2023/7/19